//package com.sqq.jfinalbase;
//
//import java.io.File;
//import java.io.IOException;
//import java.lang.reflect.Method;
//import java.text.ParseException;
//import java.text.SimpleDateFormat;
//import java.util.Calendar;
//import java.util.Map;
//import java.util.Map.Entry;
//import java.util.UUID;
//
//import javax.servlet.http.HttpServletRequest;
//
//import org.apache.commons.io.FileUtils;
//import org.apache.commons.lang.StringUtils;
//import org.apache.log4j.Logger;
//
//import com.jfinal.core.Controller;
//import com.jfinal.plugin.activerecord.ActiveRecordException;
//import com.jfinal.plugin.activerecord.Model;
//import com.jfinal.plugin.activerecord.Page;
//import com.jfinal.plugin.activerecord.Table;
//import com.jfinal.plugin.activerecord.TableMapping;
//import com.jfinal.upload.UploadFile;
//import com.sqq.model.sys.TenantAccountModel;
//import com.sqq.model.sys.TenantInfoModel;
//import com.sqq.model.sys.WeixinModel;
//
//public class SqqController extends Controller {
//
//    private static final Logger logger = Logger.getLogger(SqqController.class);
//
//    private static final String SESSION_KEY_TENANT = "tenant";
//    private static final String TENANT_ID          = "tenant_id";
//    private static final String SESSION_WEIXIN_ID  = "weixinid";
//    private static final String SESSION_LOGIN_USER = "loginuser";
//    private static final String SESSION_KEY_WEIXIN = "weixin";
//
//    public void setWxId(String weixinid) {
//        setSessionAttr(SESSION_WEIXIN_ID, weixinid);
//        removeSessionAttr(SESSION_KEY_WEIXIN);
//        removeSessionAttr(SESSION_KEY_TENANT);
//    }
//
//    public String getWxId() {
//        return getSessionAttr(SESSION_WEIXIN_ID);
//    }
//
//    public String getTeantId() {
//        WeixinModel wx = getWx();
//        if (wx == null){
//            return String.valueOf(getLoginUser().getInt(TENANT_ID));
//        }
//        return String.valueOf(wx.getInt(TENANT_ID));
//    }
//    /**
//     * 获取登录用户信息
//     * <br>
//     * @author shiming
//     * @since  SQQ-子系统缩写 V100R001, 2014年7月26日
//     * @return
//     */
//    public TenantAccountModel getLoginUser() {
//        return getSessionAttr(SESSION_LOGIN_USER);
//    }
//
//    public void setLoginUser(TenantAccountModel m) {
//        setSessionAttr(SESSION_LOGIN_USER, m);
//    }
//
//    /**
//     * 获取微信
//     * <br>
//     * @author shiming
//     * @since  SQQ-子系统缩写 V100R001, 2014年7月3日
//     * @return
//     */
//    public WeixinModel getWx() {
//        Object weixin = getSessionAttr(SESSION_KEY_WEIXIN);
//        if (weixin == null) {
//            weixin = WeixinModel.dao.findById(getWxId());
//            setSessionAttr(SESSION_KEY_WEIXIN, weixin);
//        }
//        return (WeixinModel) weixin;
//    }
//
//    /**
//     * 获取当前登陆人的租户信息
//     * <br>
//     * @author shiming
//     * @since  SQQ-子系统缩写 V100R001, 2014年7月3日
//     * @return
//     */
//    public TenantInfoModel getTeant() {
//        TenantInfoModel tenant = getSessionAttr(SESSION_KEY_TENANT);
//        if(tenant==null){
//            tenant = TenantInfoModel.dao.findById(getTeantId());
//            setSessionAttr(SESSION_KEY_TENANT,tenant);
//        }
//        return tenant;
//    }
//
//    /**
//     * 获取当前登陆人的租户信息 <br>
//     * 
//     * @author shiming
//     * @since SQQ-子系统缩写 V100R001, 2014年7月3日
//     * @return
//     */
//    public TenantInfoModel getTenant(int tenantId) {
//        TenantInfoModel tenant = getSessionAttr(SESSION_KEY_TENANT);
//        if (tenant == null) {
//            tenant = TenantInfoModel.dao.findById(tenantId);
//            setSessionAttr(SESSION_KEY_TENANT, tenant);
//        }
//        return tenant;
//    }
//
//    public String getFileSavePath() {
//        return getSession().getServletContext().getRealPath("/upload/");
//    }
//
//    public UploadFile getSqqFile(String fileName) {
//        return super.getFile(fileName, getFileSavePath());
//    }
//
//    /**
//     * 文件保存
//     * <br>
//     * @author shiming
//     * @since  SQQ-子系统缩写 V100R001, 2014年6月29日
//     * @param fileUpload
//     * @return
//     */
//    public String saveFile(UploadFile fileUpload) {
//        File file = fileUpload.getFile();
//        String parent = file.getParent();
//        String fileName = file.getName();
//        String extention = "";
//        int i = fileName.lastIndexOf(".");
//        if (i > -1 && i < fileName.length()) {
//            extention = fileName.substring(i); //--扩展名
//        }
//
//        Calendar instance = Calendar.getInstance();
//        String path = getTeantId() + File.separator + instance.get(Calendar.YEAR) + File.separator
//                      + (instance.get(Calendar.MONTH) + 1) + File.separator
//                      + instance.get(Calendar.DAY_OF_MONTH) + File.separator + UUID.randomUUID()
//                      + extention;
//        File newfile = new File(parent + File.separator + path);
//        newfile.getParentFile().mkdirs();
//        try {
//            FileUtils.copyFile(file, newfile);
//            file.delete();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return StringUtils.replace(path, File.separator, "/");
//    }
//
//    public EasyUiBean getUiBean(Page page) {
//        EasyUiBean ui = new EasyUiBean();
//        ui.setRows(page.getList());
//        ui.setTotal(page.getTotalRow());
//        return ui;
//    }
//
//    @SuppressWarnings({ "rawtypes", "unchecked" })
//    @Override
//    public <T> T getModel(Class<T> modelClass) {
//
//        HttpServletRequest request = getRequest();
//
//        Object model = null;
//
//        try {
//            model = modelClass.newInstance();
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//
//        if (model instanceof Model)
//            injectActiveRecordModel((Model) model, request);
//        else
//            injectCommonModel(model, getRequest(), modelClass);
//
//        return (T) model;
//    }
//
//    @Override
//    public <T> T getModel(Class<T> modelClass, String modelName) {
//        return super.getModel(modelClass, modelName);
//    }
//
//    private final void injectCommonModel(Object model, HttpServletRequest request, Class<?> modelClass) {
//        Method[] methods = modelClass.getMethods();
//        for (Method method : methods) {
//            String methodName = method.getName();
//            if (methodName.startsWith("set") == false) // only setter method
//                continue;
//
//            Class<?>[] types = method.getParameterTypes();
//            if (types.length != 1) // only one parameter
//                continue;
//
//            String attrName = methodName.substring(3);
//            String value = request.getParameter(attrName);
//            if (value != null) {
//                try {
//                    method.invoke(model, TypeConverter.convert(types[0], value));
//                } catch (Exception e) {
//                    throw new RuntimeException(e);
//                }
//            }
//        }
//    }
//
//    @SuppressWarnings("rawtypes")
//    private final void injectActiveRecordModel(Model<?> model, HttpServletRequest request) {
//
//        Table table = TableMapping.me().getTable(model.getClass());
//
//        Map<String, String[]> parasMap = request.getParameterMap();
//        for (Entry<String, String[]> e : parasMap.entrySet()) {
//            String paraKey = e.getKey();
//            Class colType = table.getColumnType(paraKey);
//            if (colType == null)
//                throw new ActiveRecordException("The model attribute " + paraKey
//                                                + " is not exists.");
//            String[] paraValue = e.getValue();
//            try {
//                // Object value = Converter.convert(colType, paraValue != null ?
//                // paraValue[0] : null);
//                Object value = paraValue[0] != null ? TypeConverter.convert(colType, paraValue[0])
//                    : null;
//                model.set(paraKey, value);
//            } catch (Exception ex) {
//                throw new RuntimeException("Can not convert parameter: " + paraKey, ex);
//            }
//        }
//    }
//
//    /**
//     * Convert String to other type object.
//     */
//    public static final class TypeConverter {
//
//        private static final int    timeStampLen     = "2011-01-18 16:18:18".length();
//        private static final String timeStampPattern = "yyyy-MM-dd HH:mm:ss";
//        private static final String datePattern      = "yyyy-MM-dd";
//
//        /**
//         * test for all types of mysql
//         * 
//         * 表单提交测试结果: 1: 表单中的域,就算不输入任何内容,也会传过来 "", 也即永远不可能为 null. 2: 如果输入空格也会提交上来
//         * 3: 需要考 model中的 string属性,在传过来 "" 时是该转成 null还是不该转换, 我想, 因为用户没有输入那么肯定是
//         * null, 而不该是 ""
//         * 
//         * 注意: 1:当clazz参数不为String.class, 且参数s为空串blank的情况, 此情况下转换结果为 null,
//         * 而不应该抛出异常 2:调用者需要对被转换数据做 null 判断，参见 ModelInjector 的两处调用
//         */
//        public static final Object convert(Class<?> clazz, String s) throws ParseException {
//            // mysql type: varchar, char, enum, set, text, tinytext, mediumtext,
//            // longtext
//            if (clazz == String.class) {
//                return ("".equals(s) ? null : s); // 用户在表单域中没有输入内容时将提交过来 "",
//                                                  // 因为没有输入,所以要转成 null.
//            }
//            s = s.trim();
//            if ("".equals(s)) { // 前面的 String跳过以后,所有的空字符串全都转成 null, 这是合理的
//                return null;
//            }
//            // 以上两种情况无需转换,直接返回, 注意, 本方法不接受null为 s 参数(经测试永远不可能传来null,
//            // 因为无输入传来的也是"")
//
//            Object result = null;
//            // mysql type: int, integer, tinyint(n) n > 1, smallint, mediumint
//            if (clazz == Integer.class || clazz == int.class) {
//                result = Integer.parseInt(s);
//            }
//            // mysql type: bigint
//            else if (clazz == Long.class || clazz == long.class) {
//                result = Long.parseLong(s);
//            }
//            // 经测试java.util.Data类型不会返回, java.sql.Date,
//            // java.sql.Time,java.sql.Timestamp 全部直接继承自 java.util.Data, 所以
//            // getDate可以返回这三类数据
//            else if (clazz == java.util.Date.class) {
//                if (s.length() >= timeStampLen) { // if (x < timeStampLen) 改用
//                                                  // datePattern 转换，更智能
//                    // Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
//                    // result = new
//                    // java.util.Date(java.sql.Timestamp.valueOf(s).getTime());
//                    // // error under jdk 64bit(maybe)
//                    result = new SimpleDateFormat(timeStampPattern).parse(s);
//                } else {
//                    // result = new
//                    // java.util.Date(java.sql.Date.valueOf(s).getTime()); //
//                    // error under jdk 64bit
//                    result = new SimpleDateFormat(datePattern).parse(s);
//                }
//            }
//            // mysql type: date, year
//            else if (clazz == java.sql.Date.class) {
//                if (s.length() >= timeStampLen) { // if (x < timeStampLen) 改用
//                                                  // datePattern 转换，更智能
//                    // result = new
//                    // java.sql.Date(java.sql.Timestamp.valueOf(s).getTime());
//                    // // error under jdk 64bit(maybe)
//                    result = new java.sql.Date(new SimpleDateFormat(timeStampPattern).parse(s)
//                        .getTime());
//                } else {
//                    // result = new
//                    // java.sql.Date(java.sql.Date.valueOf(s).getTime()); //
//                    // error under jdk 64bit
//                    result = new java.sql.Date(new SimpleDateFormat(datePattern).parse(s).getTime());
//                }
//            }
//            // mysql type: time
//            else if (clazz == java.sql.Time.class) {
//                result = java.sql.Time.valueOf(s);
//            }
//            // mysql type: timestamp, datetime
//            else if (clazz == java.sql.Timestamp.class) {
//                result = java.sql.Timestamp.valueOf(s);
//            }
//            // mysql type: real, double
//            else if (clazz == Double.class) {
//                result = Double.parseDouble(s);
//            }
//            // mysql type: float
//            else if (clazz == Float.class) {
//                result = Float.parseFloat(s);
//            }
//            // mysql type: bit, tinyint(1)
//            else if (clazz == Boolean.class) {
//                result = Boolean.parseBoolean(s) || "1".equals(s);
//            }
//            // mysql type: decimal, numeric
//            else if (clazz == java.math.BigDecimal.class) {
//                result = new java.math.BigDecimal(s);
//            }
//            // mysql type: unsigned bigint
//            else if (clazz == java.math.BigInteger.class) {
//                result = new java.math.BigInteger(s);
//            }
//            // mysql type: binary, varbinary, tinyblob, blob, mediumblob,
//            // longblob. I have not finished the test.
//            else if (clazz == byte[].class) {
//                result = s.getBytes();
//            } else {
//                throw new RuntimeException("Please add code in " + TypeConverter.class
//                                           + ". The type can't be converted: " + clazz.getName());
//            }
//
//            return result;
//        }
//    }
//}
